﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zhaoxi.FactoryDeviceSystem.Utils
{
    // 定义一个静态类，用于计算 CRC-16 校验码
    public static class Crc16
    {
        // CRC-16-IBM（多项式 0x8005，初始值 0xFFFF，异或输出 0x0000）
        // 计算给定字节数组的 CRC-16 校验值
        public static ushort Compute(byte[] data)
        {
            // 定义多项式（0x8005 反转后的多项式）
            const ushort polynomial = 0xA001;
            // 初始化 CRC 寄存器为 0xFFFF
            ushort crc = 0xFFFF;

            // 遍历数据数组中的每个字节
            foreach (byte b in data)
            {
                // 将当前字节与 CRC 寄存器进行异或操作
                crc ^= b;
                // 对每个字节的 8 位进行处理
                for (int i = 0; i < 8; i++)
                {
                    // 检查 CRC 寄存器的最低位是否为 1
                    if ((crc & 0x0001) != 0)
                    {
                        // 如果最低位为 1，将 CRC 寄存器右移一位，并与多项式进行异或操作
                        crc >>= 1;
                        crc ^= polynomial;
                    }
                    else
                    {
                        // 如果最低位为 0，仅将 CRC 寄存器右移一位
                        crc >>= 1;
                    }
                }
            }

            // 返回计算得到的 CRC 校验值
            return crc;
        }
        // 将 CRC 转换为大端序字节数组（高字节在前）
        public static byte[] ToBigEndianBytes(ushort crc)
        {
            // 将 CRC 校验值拆分为高字节和低字节，并存储在一个字节数组中
            return new byte[] { (byte)(crc >> 8), (byte)(crc & 0xFF) };
        }
    }
}
